// 防止头文件被重复包含
#pragma once

// 引入SDL3核心库和图像库头文件
#include <SDL3/SDL.h>
#include <SDL3_image/SDL_image.h>

// 定义导出/导入宏，用于DLL编译
// 当定义PINEA_BUILD_DLL时（编译DLL时），使用__declspec(dllexport)导出符号
// 否则（使用DLL时），使用__declspec(dllimport)导入符号
#ifdef PINEA_BUILD_DLL
#define PINEA_API __declspec(dllexport)
#else
#define PINEA_API __declspec(dllimport)
#endif

// 事件结构体，用于传递输入事件信息
struct PINEA_API PineaEvent {
    int type;  // 事件类型（如键盘按下、窗口关闭等）
    int key;   // 按键代码（当事件类型为键盘事件时有效）
};

// 颜色结构体，包含RGBA四个通道
struct PINEA_API PineaColor {
    int r;  // 红色通道（0-255）
    int g;  // 绿色通道（0-255）
    int b;  // 蓝色通道（0-255）
    int a;  // alpha通道（透明度，0-255）
};

// 矩形结构体，复用SDL的SDL_FRect（浮点精度矩形）
// 包含x, y（左上角坐标）和w, h（宽高）
typedef SDL_FRect PineaRect;

// 图像结构体，封装SDL纹理指针和图像尺寸信息
struct SDLPineaImage{
    SDL_Texture* imagePointer;  // SDL纹理指针（修正拼写错误：iamgePointer -> imagePointer）
    int width;                  // 图像宽度
    int height;                 // 图像高度
};

// 使用extern "C"包裹，确保C++编译时按C语言规则生成符号（避免名称修饰）
extern "C" {
    // 初始化Pinea引擎，创建窗口和渲染器
    // 参数：窗口标题、窗口宽度、窗口高度
    PINEA_API void pineaInit(const char* title, int width, int height);

    // 退出Pinea引擎，释放所有资源
    PINEA_API void pineaQuit();

    // 显示窗口（通常在初始化后调用）
    PINEA_API void pineaShow();

    // 处理事件队列，获取下一个事件
    // 参数：事件指针（用于存储获取到的事件）
    // 返回值：是否成功获取事件（true表示有事件，false表示无事件）
    PINEA_API bool pineaPollEvent(PineaEvent* event);

    // 清空渲染目标，使用指定颜色填充
    // 参数：颜色指针（指定清空颜色）
    PINEA_API void pineaClear(const PineaColor* color);

    // 执行渲染，将渲染缓冲区内容显示到屏幕
    PINEA_API void pineaRender();

    // 绘制填充矩形
    // 参数：矩形指针（位置和大小）、颜色指针（填充颜色）
    PINEA_API void pineaFillRect(const PineaRect* rect, const PineaColor* color);

    // 加载图像文件到SDLPineaImage结构体
    // 参数：文件路径、图像结构体指针（用于存储加载结果）
    PINEA_API void pineaLoadImage(const char* path, SDLPineaImage* sdlPineaImage);

    // 绘制图像
    // 参数：SDL纹理指针、源矩形（图像中要绘制的区域，nullptr表示整图）
    //       目标矩形（屏幕上的绘制位置和大小）、旋转角度、翻转模式
    PINEA_API void pineaDrawImage(SDL_Texture* image, const PineaRect* srcRect, const PineaRect* dstRect, double angle, int flip);

    // 释放图像资源（销毁SDL纹理）
    // 参数：要释放的SDL纹理指针
    PINEA_API void pineaDropImage(SDL_Texture* image);
}
